package initialize

import (
	"go.uber.org/zap"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"log"
	"mine-info-server/config"
	"mine-info-server/global"
	"mine-info-server/initialize/internal"
	"time"
)

// GormMysql 初始化Mysql数据库
// Author [piexlmax](https://github.com/piexlmax)
// Author [SliverHorn](https://github.com/SliverHorn)
func GormMysql() *gorm.DB {
	m := global.GVA_CONFIG.Mysql
	if m.Dbname == "" {
		return nil
	}
	mysqlConfig := mysql.Config{
		DSN:                       m.Dsn(), // DSN data source name
		DefaultStringSize:         191,     // string 类型字段的默认长度
		SkipInitializeWithVersion: false,   // 根据版本自动配置
	}
	if db, err := gorm.Open(mysql.New(mysqlConfig), internal.Gorm.Config()); err != nil {
		global.GVA_LOG.Error("gorm.Open 数据库连接失败", zap.Error(err))
		log.Fatalf("数据库连接失败 err:%v", err)
		return nil
	} else {
		//_ = db.Use(dbresolver.Register(dbresolver.Config{
		//	Sources:  []gorm.Dialector{mysql.Open(m.Dsn())},
		//	Replicas: []gorm.Dialector{mysql.Open("root:123456@tcp(127.0.0.1:3307)/mine_info?charset=utf8mb4&parseTime=True&loc=Local")}, // 从库DSN
		//	Policy:   dbresolver.RandomPolicy{},
		//}))
		sqlDB, _ := db.DB()
		sqlDB.SetConnMaxLifetime(100 * time.Second) // 100s不使用自动关闭连接
		sqlDB.SetMaxIdleConns(m.MaxIdleConns)
		sqlDB.SetMaxOpenConns(m.MaxOpenConns)
		return db
	}
}

// GormMysqlByConfig 初始化Mysql数据库用过传入配置
func GormMysqlByConfig(m config.DB) *gorm.DB {
	if m.Dbname == "" {
		return nil
	}
	mysqlConfig := mysql.Config{
		DSN:                       m.Dsn(), // DSN data source name
		DefaultStringSize:         191,     // string 类型字段的默认长度
		SkipInitializeWithVersion: false,   // 根据版本自动配置
	}
	if db, err := gorm.Open(mysql.New(mysqlConfig), internal.Gorm.Config()); err != nil {
		panic(err)
	} else {
		sqlDB, _ := db.DB()
		sqlDB.SetMaxIdleConns(m.MaxIdleConns)
		sqlDB.SetMaxOpenConns(m.MaxOpenConns)
		return db
	}
}
